﻿using Sage.WindowsProcess.Events;
using System.Diagnostics;

namespace Sage.WindowsProcess
{
    /// <summary>
    /// ExternalProcessManager类的事件相关部分
    /// </summary>
    public partial class ExternalProcessManager
    {
        /// <summary>
        /// 当进程输出数据时发生。
        /// </summary>
        public event EventHandler<ProcessOutputEventArgs>? OutputReceived;

        /// <summary>
        /// 当进程产生错误输出时发生。
        /// </summary>
        public event EventHandler<ProcessOutputEventArgs>? ErrorReceived;

        /// <summary>
        /// 当进程启动时发生。
        /// </summary>
        public event EventHandler<ProcessEventArgs>? ProcessStarted;

        /// <summary>
        /// 当进程被检测到已经在运行时发生。
        /// </summary>
        public event EventHandler<ProcessEventArgs>? ProcessAlreadyRunning;

        /// <summary>
        /// 当进程停止时发生。
        /// </summary>
        public event EventHandler<ProcessEventArgs>? ProcessStopped;

        /// <summary>
        /// 当进程退出时发生。
        /// </summary>
        public event EventHandler<ProcessExitedEventArgs>? ProcessExited;

        /// <summary>
        /// 当进程操作产生错误时发生。
        /// </summary>
        public event EventHandler<ProcessErrorEventArgs>? ProcessError;

        /// <summary>
        /// 当进程状态（如CPU、内存使用）更新时发生。
        /// </summary>
        public event EventHandler<ProcessStatusEventArgs>? ProcessStatusUpdated;

        /// <summary>
        /// 引发 OutputReceived 事件。
        /// </summary>
        /// <param name="data">输出数据。</param>
        protected virtual void OnOutputReceived(string data)
        {
            var args = new ProcessOutputEventArgs(data);
            OutputReceived?.Invoke(this, args);
            Debug.WriteLine($"进程输出: {data}");
        }

        /// <summary>
        /// 引发 ErrorReceived 事件。
        /// </summary>
        /// <param name="data">错误数据。</param>
        protected virtual void OnErrorReceived(string data)
        {
            var args = new ProcessOutputEventArgs(data);
            ErrorReceived?.Invoke(this, args);
            Debug.WriteLine($"进程错误: {data}");
        }

        /// <summary>
        /// 引发 ProcessStarted 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessStarted(ProcessEventArgs args)
        {
            ProcessStarted?.Invoke(this, args);
            Debug.WriteLine($"进程 {_processName} (ID: {args.Process.Id}) 已启动。");
        }

        /// <summary>
        /// 引发 ProcessAlreadyRunning 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessAlreadyRunning(ProcessEventArgs args)
        {
            ProcessAlreadyRunning?.Invoke(this, args);
            Debug.WriteLine($"进程 {_processName} (ID: {args.Process.Id}) 已经在运行。");
        }

        /// <summary>
        /// 引发 ProcessStopped 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessStopped(ProcessEventArgs args)
        {
            ProcessStopped?.Invoke(this, args);
            Debug.WriteLine($"进程 {_processName} 已停止。");
        }

        /// <summary>
        /// 引发 ProcessExited 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessExited(ProcessExitedEventArgs args)
        {
            ProcessExited?.Invoke(this, args);
            Debug.WriteLine($"进程 {_processName} 已退出，退出代码: {args.ExitCode}。");
        }

        /// <summary>
        /// 引发 ProcessError 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessError(ProcessErrorEventArgs args)
        {
            ProcessError?.Invoke(this, args);
            Debug.WriteLine($"进程错误: {args.ErrorMessage}");
            if (args.Exception != null)
            {
                Debug.WriteLine($"异常详情: {args.Exception}");
            }
        }

        /// <summary>
        /// 引发 ProcessStatusUpdated 事件。
        /// </summary>
        /// <param name="args">事件参数。</param>
        protected virtual void OnProcessStatusUpdated(ProcessStatusEventArgs args)
        {
            ProcessStatusUpdated?.Invoke(this, args);
        }
    }
}
